#if LV_BUILD_TEST
// 包含LVGL库的主要头文件
#include "../lvgl.h"
// 标准输入输出库
#include <stdio.h>
// 标准库，用于内存管理等
#include <stdlib.h>

// 包含系统时间库
#include <sys/time.h>
// 当前文件的头文件声明
#include "lv_test_indev.h"
// 包含初始化函数的头文件声明
#include "lv_test_init.h"

// 鼠标的当前坐标
static lv_coord_t x_act;
static lv_coord_t y_act;
// 当前按键
static uint32_t key_act;
// 编码器的当前状态差值
static int32_t diff_act;
// 鼠标是否被按下
static bool mouse_pressed;
// 按键是否被按下
static bool key_pressed;
// 编码器是否被按下
static bool enc_pressed;

// 鼠标输入设备的读取回调函数
void lv_test_mouse_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
    // 忽略输入设备驱动参数
    LV_UNUSED(drv);
    // 设置输入数据的坐标为当前坐标
    data->point.x = x_act;
    data->point.y = y_act;
    // 设置输入状态为按下或释放
    data->state = mouse_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
}

// 设置鼠标移动到指定坐标
void lv_test_mouse_move_to(lv_coord_t x, lv_coord_t y)
{
    x_act = x;
    y_act = y;
}

// 设置鼠标相对移动指定距离
void lv_test_mouse_move_by(lv_coord_t x, lv_coord_t y)
{
    x_act += x;
    y_act += y;
}

// 设置鼠标为按下状态
void lv_test_mouse_press(void)
{
    mouse_pressed = true;
}

// 设置鼠标为释放状态
void lv_test_mouse_release(void)
{
    mouse_pressed = false;
}

// 模拟鼠标在指定坐标点击
void lv_test_mouse_click_at(lv_coord_t x, lv_coord_t y)
{
    lv_test_mouse_release(); // 先释放鼠标
    lv_test_indev_wait(50); // 等待50ms
    lv_test_mouse_move_to(x, y); // 移动到目标坐标
    lv_test_mouse_press(); // 按下鼠标
    lv_test_indev_wait(50); // 等待50ms
    lv_test_mouse_release(); // 释放鼠标
    lv_test_indev_wait(50); // 等待50ms
}

// 键盘输入设备的读取回调函数
void lv_test_keypad_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
    LV_UNUSED(drv); // 忽略输入设备驱动参数
    data->key = key_act; // 设置当前按键
    data->state = key_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; // 设置输入状态为按下或释放
}

// 模拟按键按下
void lv_test_key_press(uint32_t k)
{
    key_act = k; // 设置当前按键
    key_pressed = true; // 设置按键为按下状态
}

// 模拟按键释放
void lv_test_key_release(void)
{
    key_pressed = false; // 设置按键为释放状态
}

// 模拟按键按下并释放
void lv_test_key_hit(uint32_t k)
{
    lv_test_key_release(); // 先释放按键
    lv_test_indev_wait(50); // 等待50ms
    lv_test_key_press(k); // 按下指定按键
    lv_test_indev_wait(50); // 等待50ms
    lv_test_key_release(); // 释放按键
    lv_test_indev_wait(50); // 等待50ms
}

// 编码器输入设备的读取回调函数
void lv_test_encoder_read_cb(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
    LV_UNUSED(drv); // 忽略输入设备驱动参数
    data->enc_diff = diff_act; // 设置编码器状态差值
    data->state = enc_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; // 设置编码器输入状态为按下或释放
    diff_act = 0; // 将状态差值重置为0，准备下一次读取
}

// 增加编码器的状态差值
void lv_test_encoder_add_diff(int32_t d)
{
    diff_act += d; // 增加编码器状态差值
}

// 模拟编码器转动指定的距离
void lv_test_encoder_turn(int32_t d)
{
    diff_act += d; // 增加编码器状态差值
    lv_test_indev_wait(50); // 等待50ms
}

// 设置编码器为按下状态
void lv_test_encoder_press(void)
{
    enc_pressed = true; // 设置编码器按下状态
}

// 设置编码器为释放状态
void lv_test_encoder_release(void)
{
    enc_pressed = false; // 设置编码器释放状态
}

// 模拟编码器点击
void lv_test_encoder_click(void)
{
    lv_test_encoder_release(); // 先释放编码器
    lv_test_indev_wait(50); // 等待50ms
    lv_test_encoder_press(); // 设置编码器为按下状态
    lv_test_indev_wait(50); // 等待50ms
    lv_test_encoder_release(); // 设置编码器为释放状态
    lv_test_indev_wait(50); // 等待50ms
}

// 使输入设备等待指定的时间
void lv_test_indev_wait(uint32_t ms)
{
    uint32_t t = lv_tick_get(); // 获取当前时间
    while(lv_tick_elaps(t) < ms) { // 当等待时间小于指定时间时循环
        lv_timer_handler(); // 处理LVGL的定时器
        lv_tick_inc(1); // 增加LVGL的刻度时间
    }
}

#endif



